home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / iguana / vts139b / lib / hardware.pas < prev    next >
Pascal/Delphi Source File  |  1993-08-31  |  11KB  |  450 lines

  1. {****************************************************************************}
  2. {                                                                            }
  3. { MODULE:         Hardware                                                   }
  4. {                                                                            }
  5. { DESCRIPTION:    An UNIT that provides general support to generic Hardware, }
  6. {                 like the PIC, the DMA controller, etc...                   }
  7. {                                                                            }
  8. { AUTHOR:         Juan Carlos Arévalo                                        }
  9. {                                                                            }
  10. { MODIFICATIONS:  Nobody (yet ;-)                                            }
  11. {                                                                            }
  12. { HISTORY:        18-Nov-1992 Documentation.                                 }
  13. {                                                                            }
  14. { (C) 1992 VangeliSTeam                                                      }
  15. {____________________________________________________________________________}
  16.  
  17. UNIT Hardware;
  18.  
  19. INTERFACE
  20.  
  21.  
  22.  
  23.  
  24. PROCEDURE EnableIRQ   (i: WORD);
  25. PROCEDURE DisableIRQ  (i: WORD);
  26. FUNCTION  IRQState    (i: WORD)               : BOOLEAN;
  27. FUNCTION  SetIRQVector(i: WORD; Vec: POINTER) : POINTER;
  28.  
  29. PROCEDURE DMASet   (Channel, Mode: WORD; Buf: POINTER; Size: WORD);
  30. PROCEDURE DMARawSet(Channel, Mode, Page: BYTE; Offs, Size: WORD);
  31. PROCEDURE DMASetAsm;
  32.  
  33. PROCEDURE DMAReset(Channel: BYTE);
  34. PROCEDURE DMAResetAsm;
  35.  
  36. FUNCTION  GetDMACount(Channel: BYTE) : WORD;
  37. FUNCTION  GetDMACountAsm             : WORD; 
  38.  
  39.  
  40.  
  41.  
  42. IMPLEMENTATION
  43.  
  44. USES Dos, Debugging;
  45.  
  46.  
  47.  
  48.  
  49. {----------------------------------------------------------------------------}
  50. { PIC routines.                                                              }
  51. {____________________________________________________________________________}
  52.  
  53. PROCEDURE EnableIRQ(i: WORD);
  54.   BEGIN
  55.     IF i < 8 THEN
  56.       PORT[$21] := PORT[$21] AND (NOT (1 SHL i))
  57.     ELSE
  58.       BEGIN
  59.         PORT[$A1] := PORT[$A1] AND (NOT (1 SHL (i-8)));
  60.         PORT[$21] := PORT[$21] AND (NOT (1 SHL 2))
  61.       END;
  62.   END;
  63.  
  64.  
  65. PROCEDURE DisableIRQ(i: WORD);
  66.   BEGIN
  67.     IF i < 8 THEN
  68.       PORT[$21] := PORT[$21] OR (1 SHL i)
  69.     ELSE
  70.       BEGIN
  71.         PORT[$A1] := PORT[$A1] OR (1 SHL (i-8))
  72.       END;
  73.   END;
  74.  
  75.  
  76. FUNCTION IRQState(i: WORD) : BOOLEAN;
  77.   BEGIN
  78.     IF i < 8 THEN
  79.       IRQState := (PORT[$21] AND (1 SHL i)) = 0
  80.     ELSE
  81.       IRQState := ((PORT[$21] AND 4)             = 0) AND
  82.                   ((PORT[$A1] AND (1 SHL (i-8))) = 0);
  83.   END;
  84.  
  85.  
  86. FUNCTION SetIRQVector(i: WORD; Vec: POINTER) : POINTER;
  87.   VAR
  88.     p : POINTER;
  89.     j : WORD;
  90.   BEGIN
  91.     IF i < 8 THEN j := i + $08
  92.              ELSE j := i + $68;
  93.  
  94.     GetIntVec(j, p);
  95.     SetIntVec(j, Vec);
  96.     SetIRQVector := p;
  97.   END;
  98.  
  99.  
  100.  
  101.  
  102. {----------------------------------------------------------------------------}
  103. { DMA routines.                                                              }
  104. {____________________________________________________________________________}
  105.  
  106. {
  107.   AH = Channel
  108.   CH = Mode
  109.   CL = Page
  110.   BX = Offset
  111.   SI = Size
  112. }
  113.  
  114. PROCEDURE DMA16Set; ASSEMBLER;
  115.   CONST
  116.     PageRegTable : ARRAY[0..3] OF WORD = ( $00, $8B, $89, $8A );
  117.   ASM
  118.  
  119.         AND     AH,3
  120.  
  121.         SHR     CL,1
  122.         RCR     BX,1
  123.         ADD     CL,CL
  124.  
  125.         MOV  AL,AH;  ADD  AL,$04; OUT $D4,AL     { Disable DMA channel.                         }
  126.         XOR  AL,AL;               OUT $D8,AL     { Clear BYTE POINTER flip-flop to lower byte.  }
  127.         MOV  AL,AH;  ADD  AL,CH;  OUT $D6,AL     { DMA Mode register.                           }
  128.         XOR  DH,DH
  129.         MOV  DL,AH
  130.         ADD  DX,DX                               
  131.         ADD  DX,DX                               { Calculate DMA base port.                     }
  132.         ADD  DX,$C0
  133.  
  134.         MOV  AL,BL;               OUT  DX,AL     { Offset of the buffer, low & high bytes.      }
  135.         MOV  AL,BH;               OUT  DX,AL             
  136.  
  137.         PUSH DX
  138.  
  139.         MOV  DL,AH
  140.         ADD  DX,DX                               
  141.         MOV  BX,OFFSET PageRegTable
  142.         ADD  BX,DX                               { Calculate page register port.                }
  143.         MOV  DX,[BX]
  144.         MOV  AL,CL;               OUT  DX,AL     { Set DMA page.                                }
  145.  
  146.         POP  DX
  147.         INC  DX
  148.         INC  DX                                  { Calculate DMA counter port.                  }
  149.  
  150.         MOV  BX,SI
  151.         MOV  AL,BL;               OUT  DX,AL     { Size of the buffer minus 1, low & high byte. }
  152.         MOV  AL,BH;               OUT  DX,AL             
  153.         MOV  AL,AH;               OUT $D4,AL     { Enable DMA channel.                          }
  154.  
  155.   END;
  156.  
  157.  
  158. PROCEDURE DMA8Set; ASSEMBLER;
  159.   CONST
  160.     PageRegTable : ARRAY[0..3] OF WORD = ( $87, $83, $81, $82 );
  161.   ASM
  162.  
  163.         MOV  AL,AH;  ADD  AL,$04; OUT  $A,AL     { Disable DMA channel.                         }
  164.         XOR  AL,AL;               OUT  $C,AL     { Clear BYTE POINTER flip-flop to lower byte.  }
  165.         MOV  AL,AH;  ADD  AL,CH;  OUT  $B,AL     { DMA Mode register.                           }
  166.         XOR  DH,DH
  167.         MOV  DL,AH
  168.         ADD  DX,DX                               { Calculate DMA base port.                     }
  169.  
  170.         MOV  AL,BL;               OUT  DX,AL     { Offset of the buffer, low & high bytes.      }
  171.         MOV  AL,BH;               OUT  DX,AL             
  172.  
  173.         PUSH DX
  174.  
  175.         MOV  BX,OFFSET PageRegTable
  176.         ADD  BX,DX                               { Calculate page register port.                }
  177.         MOV  DX,[BX]
  178.         MOV  AL,CL;               OUT  DX,AL     { Set DMA page.                                }
  179.  
  180.         POP  DX
  181.         INC  DX                                  { Calculate DMA counter port.                  }
  182.  
  183.         MOV  BX,SI
  184.         MOV  AL,BL;               OUT  DX,AL     { Size of the buffer minus 1, low & high byte. }
  185.         MOV  AL,BH;               OUT  DX,AL             
  186.         MOV  AL,AH;               OUT  $A,AL     { Enable DMA channel.                          }
  187.  
  188.   END;
  189.  
  190.  
  191. PROCEDURE DMA16Reset; ASSEMBLER;
  192.   ASM
  193.  
  194.         AND     AH,3
  195.  
  196.         MOV  AL,AH;  ADD  AL,$04; OUT $D4,AL     { Disable DMA channel.                         }
  197.  
  198.   END;
  199.  
  200.  
  201. PROCEDURE DMA8Reset; ASSEMBLER;
  202.   ASM
  203.  
  204.         MOV  AL,AH;  ADD  AL,$04; OUT  $A,AL     { Disable DMA channel.                         }
  205.  
  206.   END;
  207.  
  208.  
  209. FUNCTION GetDMA16Count : WORD; ASSEMBLER;
  210.   ASM
  211.  
  212.         AND     AH,3
  213.  
  214.         XOR  AL,AL;               OUT $D8,AL     { Clear BYTE POINTER flip-flop to lower byte.  }
  215.  
  216.         XOR  DH,DH
  217.         MOV  DL,AH
  218.         ADD  DX,DX                               
  219.         ADD  DX,DX                               { Calculate DMA base port.                     }
  220.         ADD  DX,$C2
  221.  
  222.         IN   AL,DX;               MOV  BL,AL     { Size of the buffer minus 1, low & high byte. }
  223.         IN   AL,DX;               MOV  BH,AL
  224.  
  225.         MOV  AX,BX
  226.  
  227.   END;
  228.  
  229.  
  230. FUNCTION GetDMA8Count : WORD; ASSEMBLER;
  231.   ASM
  232.  
  233.         XOR  AL,AL;               OUT  $C,AL     { Clear BYTE POINTER flip-flop to lower byte.  }
  234.  
  235.         XOR  DH,DH
  236.         MOV  DL,AH
  237.         ADD  DX,DX                               { Calculate DMA base port.                     }
  238.         INC  DX
  239.  
  240.         IN   AL,DX;               MOV  BL,AL     { Size of the buffer minus 1, low & high byte. }
  241.         IN   AL,DX;               MOV  BH,AL
  242.         MOV  CX,BX
  243.  
  244.         IN   AL,DX;               MOV  BL,AL     { Size of the buffer minus 1, low & high byte. }
  245.         IN   AL,DX;               MOV  BH,AL
  246.  
  247.         MOV  AX,BX
  248.  
  249.         MOV  SI,CX
  250.         SUB  SI,BX
  251.         CMP  SI,5
  252.         JC   @@ya
  253.         MOV  AX,CX
  254.         CMP  SI,260
  255.         JC   @@ya
  256.         MOV  AX,BX
  257.         CMP  SI,$FF01
  258.         JNC  @@ya
  259.  
  260.         MOV  AX,$FFFF
  261. @@ya:
  262. (*
  263.         PUSH    AX
  264.  
  265.         MOV  DL,[Debug]
  266.         PUSH DX
  267.         MOV  DL,1
  268.         MOV  [Debug],DL
  269.  
  270.         PUSH AX
  271.         PUSH BX
  272.  
  273.         PUSH CX
  274.         PUSH $7
  275.         CALL WriteSNum
  276.  
  277.         POP  BX
  278.  
  279.         PUSH BX
  280.         PUSH $6
  281.         CALL WriteSNum
  282.  
  283.         POP  AX
  284.  
  285.         PUSH AX
  286.         PUSH $4
  287.         CALL WriteSNum
  288.  
  289.         POP  DX
  290.         MOV  [Debug],DL
  291.  
  292.         POP     AX
  293. *)
  294. (*
  295.         CMP  SI,DI    { Get the value that repeats. }
  296.         JZ   @@ya
  297.  
  298.         MOV  AL,[Debug]
  299.         PUSH AX
  300.         MOV  AL,1
  301.         MOV  [Debug],AL
  302.  
  303.         PUSH BX
  304.         PUSH DI
  305.  
  306.         PUSH SI
  307.         PUSH $7
  308.         CALL WriteSNum
  309.  
  310.         POP  DI
  311.  
  312.         PUSH DI
  313.         PUSH $6
  314.         CALL WriteSNum
  315.  
  316.         POP  BX
  317.         PUSH BX
  318.  
  319.         PUSH BX
  320.         PUSH $5
  321.         CALL WriteSNum
  322.  
  323.         POP  BX
  324.  
  325.         POP  AX
  326.         MOV  [Debug],AL
  327.  
  328.         MOV  SI,BX
  329.  
  330. @@ya:   MOV  AX,SI
  331. *)
  332.   END;
  333.  
  334.  
  335.  
  336. FUNCTION GetDMACountAsm : WORD; ASSEMBLER;
  337.   ASM
  338.  
  339.                 CMP     AH,2
  340.                 JZ      @@Fin
  341.                 CMP     AH,4
  342.                 JZ      @@Fin
  343.                 JB      @@8bit
  344.                  CALL   GetDMA16Count
  345.                 JMP    @@Fin
  346. @@8bit:          CALL   GetDMA8Count
  347.  
  348. @@Fin:
  349.  
  350.   END;
  351.  
  352.  
  353. PROCEDURE DMASetAsm; ASSEMBLER;
  354.   ASM
  355.  
  356.                 CMP     AH,2
  357.                 JZ      @@Fin
  358.                 CMP     AH,4
  359.                 JZ      @@Fin
  360.                 JB      @@8bit
  361.                  CALL   DMA16Set
  362.                 JMP    @@Fin
  363. @@8bit:          CALL   DMA8Set
  364.  
  365. @@Fin:
  366.  
  367.   END;
  368.  
  369.  
  370. PROCEDURE DMAResetAsm; ASSEMBLER;
  371.   ASM
  372.  
  373.                 CMP     AH,2
  374.                 JZ      @@Fin
  375.                 CMP     AH,4
  376.                 JZ      @@Fin
  377.                 JB      @@8bit
  378.                  CALL   DMA16Reset
  379.                 JMP    @@Fin
  380. @@8bit:          CALL   DMA8Reset
  381.  
  382. @@Fin:
  383.  
  384.   END;
  385.  
  386.  
  387. PROCEDURE DMARawSet(Channel, Mode, Page: BYTE; Offs, Size: WORD); ASSEMBLER;
  388.   ASM
  389.  
  390.         MOV     AH,[Channel]
  391.         MOV     CH,[Mode]
  392.         MOV     CL,[Page]
  393.         MOV     BX,[Offs]
  394.         MOV     SI,[Size]
  395.  
  396.         CALL    DMASetAsm
  397.  
  398.   END;
  399.  
  400.  
  401. FUNCTION GetDMACount(Channel: BYTE) : WORD; ASSEMBLER;
  402.   ASM
  403.  
  404.         MOV     AH,[Channel]
  405.  
  406.         CALL    GetDMACountAsm
  407.  
  408.   END;
  409.  
  410.  
  411. PROCEDURE DMASet(Channel, Mode: WORD ; Buf: POINTER; Size: WORD);
  412.   VAR
  413.     Segm : WORD;
  414.     Offs : WORD;
  415.   BEGIN
  416.  
  417.     Segm := SEG(Buf^) AND $F000;
  418.     Offs := SEG(Buf^) AND $0FFF;
  419.  
  420.     IF Offs > 65535 - OFS(Buf^) THEN
  421.       BEGIN
  422.         INC(Segm, $1000);
  423.         Offs := WORD(Offs - 65536 + OFS(Buf^));
  424.       END
  425.     ELSE
  426.       BEGIN
  427.         Offs := Offs + OFS(Buf^);
  428.       END;
  429.  
  430.     DEC(Size);
  431.  
  432.     DMARawSet(Channel, Mode, Segm SHR 12, Offs, Size);
  433.  
  434.   END;
  435.  
  436.  
  437. PROCEDURE DMAReset(Channel: BYTE); ASSEMBLER;
  438.   ASM
  439.  
  440.         MOV     AH,[Channel]
  441.  
  442.         CALL    DMAResetAsm
  443.  
  444.   END;
  445.  
  446.  
  447.  
  448.  
  449. END.
  450.